import Foundation
import Combine

// 在Xcode项目中，需要确保Models目录中的文件被正确包含在编译目标中
// Box模型定义在Models/Box.swift文件中

/// 盒子管理服务，负责盒子的增删改查操作
class BoxManager: ObservableObject {
    static let shared = BoxManager()
    
    private let boxesKey = "userBoxes"
    @Published private var boxes: [Box] = []
    
    private init() {
        loadBoxes()
        ensureDefaultBoxExists()
    }
    
    // MARK: - 公开方法
    
    /// 获取所有盒子
    func getAllBoxes() -> [Box] {
        return boxes
    }
    
    /// 获取当前选中的盒子
    func getCurrentBox() -> Box {
        // 这里简单返回第一个盒子，实际应该保存用户选择
        return boxes.first ?? Box.defaultBox()
    }
    
    /// 添加新盒子
    func addBox(name: String) throws {
        // 检查名称是否已存在
        if boxes.contains(where: { $0.name == name }) {
            throw BoxError.duplicateName
        }
        
        let newBox = Box(name: name)
        boxes.append(newBox)
        saveBoxes()
    }
    
    /// 重命名盒子
    func renameBox(boxId: UUID, newName: String) throws {
        // 检查名称是否已存在
        if boxes.contains(where: { $0.name == newName && $0.id != boxId }) {
            throw BoxError.duplicateName
        }
        
        guard let index = boxes.firstIndex(where: { $0.id == boxId }) else {
            throw BoxError.notFound
        }
        
        boxes[index].name = newName
        saveBoxes()
    }
    
    /// 删除盒子
    func deleteBox(boxId: UUID) throws {
        guard let index = boxes.firstIndex(where: { $0.id == boxId }) else {
            throw BoxError.notFound
        }
        
        let box = boxes[index]
        
        // 检查是否为默认盒子（不可删除）
        if box.isDefault {
            throw BoxError.cannotDeleteDefault
        }
        
        boxes.remove(at: index)
        saveBoxes()
    }
    
    /// 切换当前盒子
    func switchToBox(boxId: UUID) throws {
        guard boxes.contains(where: { $0.id == boxId }) else {
            throw BoxError.notFound
        }
        
        // 这里应该保存当前选中的盒子ID到UserDefaults
        UserDefaults.standard.set(boxId.uuidString, forKey: "currentBoxId")
    }
    
    /// 设置默认盒子（只能有一个默认盒子）
    func setDefaultBox(boxId: UUID) throws {
        guard let index = boxes.firstIndex(where: { $0.id == boxId }) else {
            throw BoxError.notFound
        }
        
        // 清除所有盒子的默认状态
        for i in boxes.indices {
            boxes[i].isDefault = false
        }
        
        // 设置新的默认盒子
        boxes[index].isDefault = true
        saveBoxes()
    }
    
    /// 获取当前默认盒子
    func getDefaultBox() -> Box? {
        return boxes.first(where: { $0.isDefault })
    }
    
    // MARK: - 私有方法
    
    private func loadBoxes() {
        guard let data = UserDefaults.standard.data(forKey: boxesKey),
              let savedBoxes = try? JSONDecoder().decode([Box].self, from: data) else {
            boxes = [Box.defaultBox()]
            return
        }
        boxes = savedBoxes
    }
    
    private func saveBoxes() {
        if let encoded = try? JSONEncoder().encode(boxes) {
            UserDefaults.standard.set(encoded, forKey: boxesKey)
        }
    }
    
    private func ensureDefaultBoxExists() {
        // 确保默认盒子存在
        if !boxes.contains(where: { $0.isDefault }) {
            boxes.insert(Box.defaultBox(), at: 0)
            saveBoxes()
        }
    }
}

// MARK: - 错误类型

enum BoxError: LocalizedError {
    case duplicateName
    case notFound
    case cannotDeleteDefault
    
    var errorDescription: String? {
        switch self {
        case .duplicateName:
            return "盒子名称已存在"
        case .notFound:
            return "未找到指定的盒子"
        case .cannotDeleteDefault:
            return "默认盒子不可删除"
        }
    }
}

// MARK: - 示例用法
/*
// 添加新盒子
try? BoxManager.shared.addBox(name: "小号一号")

// 重命名盒子
let boxId = boxes[0].id
try? BoxManager.shared.renameBox(boxId: boxId, newName: "主战号")

// 删除盒子（默认盒子会抛出错误）
try? BoxManager.shared.deleteBox(boxId: boxId)

// 设置默认盒子
try? BoxManager.shared.setDefaultBox(boxId: boxId)

// 获取所有盒子
let allBoxes = BoxManager.shared.getAllBoxes()
*/